package org.phalanx.gwt.client.graphics.map;

import java.util.ArrayList;

import org.phalanx.gwt.client.shared.ServerMessage;

import com.google.gwt.user.client.Window;

public class PhalanxMapReader {
	private PhalanxMap pMap;
	
	public PhalanxMapReader(){
	}
	
	public void setMapData(ServerMessage mapMessage){
		pMap = new PhalanxMap();
		String tileSetData = mapMessage.getMessageContentsValue("tilesetdata");
		String tileSetName = mapMessage.getMessageContentsValue("tilesetname");
		String mapName = mapMessage.getMessageContentsValue("mapname");
		String authorName = mapMessage.getMessageContentsValue("authorname");
		String authorCountry = mapMessage.getMessageContentsValue("country");
		String mapLength = mapMessage.getMessageContentsValue("l");
		String mapWidth = mapMessage.getMessageContentsValue("w");
		String mapTileSize = mapMessage.getMessageContentsValue("tilesize");
		String defaultTile = mapMessage.getMessageContentsValue("defaulttile");
		String buildPoints = mapMessage.getMessageContentsValue("buildpoints");
		String mapdata = mapMessage.getMessageContentsValue("mapdata");
		
		if (tileSetData != null && !tileSetData.isEmpty()){
			pMap.setMapTileSet(getMapTileSet(tileSetData));
			pMap.getMapTileSet().setTileSetName(tileSetName);
			MapTile dTile = pMap.getMapTileSet().getMapTileByName(defaultTile);
			pMap.setDefaultMapTile(dTile, false);
		}
		
		pMap.setMapName(mapName);
/*		pMap.setAuthorName(authorName);
		pMap.setAuthorCountry(authorCountry);*/
		pMap.setMapDimensions(Integer.valueOf(mapLength), Integer.valueOf(mapWidth));
		pMap.setTileSize(Integer.valueOf(mapTileSize));
		
		if (mapdata != null && !mapdata.isEmpty()){
			setMapTileData(mapdata);
		}
		if (buildPoints != null && !buildPoints.isEmpty()){
			setBuildPoints(buildPoints);
		}
	}
	
	public PhalanxMap getMap(){
		return pMap;
	}
	
	private void setMapTileData(String mapData){
		String[] mapTileData = mapData.split(":");
		
		if (mapTileData.length > 0){
			for (int i = 0; i < mapTileData.length; i++){
				String aTile = mapTileData[i]; // Data looks like {x:y:tilename}...
				aTile = aTile.substring(1, aTile.length() - 1); // Data now looks like x:y:tilename
				
				String[] aTileData = aTile.split("!");
				if (aTileData.length == 3){
					Integer xCoor = Integer.valueOf(aTileData[0]);
					Integer yCoor = Integer.valueOf(aTileData[1]);
					String tileName = aTileData[2];
					
					pMap.setMapTile(xCoor, yCoor, pMap.getMapTileSet().getMapTileByName(tileName));
				}
			}
		}
	}
	
	private void setBuildPoints(String bpData){
		String[] bpList = bpData.split(":");
		
		if (bpList.length > 0){
			for (int i = 0; i < bpList.length; i++){
				String buildPointCoordinates = bpList[i];
				buildPointCoordinates = buildPointCoordinates.substring(1, buildPointCoordinates.length() - 1);
				
				String[] coordinates = buildPointCoordinates.split("!");
				
				if (coordinates.length == 2){
					MapCoordinates c = new MapCoordinates(Integer.valueOf(coordinates[0]), 
							Integer.valueOf(coordinates[1]));
					
					pMap.addBuildPoint(c);
				}
			}
		}
	}
	
	private MapTileSet getMapTileSet(String mapTileData){
		MapTileSet t = null;
		PhalanxTileSetReader tileReader = new PhalanxTileSetReader();
		String[] mapTileList = mapTileData.split(":");
		
		if (mapTileList.length > 0){
			ArrayList<String> mapTileArray = new ArrayList<String>();
			
			for (int i = 0; i < mapTileList.length; i++){
				mapTileArray.add(mapTileList[i]);
			}
			
			tileReader.setTileSetReferenceList(mapTileArray);
			tileReader.readInTileSetInfo();
			t = tileReader.getMapTileSet();
		}
		
		return t;
	}
}
